import time
import argparse
import asyncio
import os
import sys
import time

from colorama import init, Fore

from FastSeeTools import urlExplore
from FastSeeTools import urlScreen

init()
# try:
#     from FastSeeTools import update
#     IS_git_ok = True
# except:
#     IS_git_ok=False
    # print(Fore.RED + "\n请安装git:https://git-scm.com/downloads (或配置git到系统路径) ,否则无法使用更新功能" + Fore.RESET)

def create_folders(path,folder):
    folder = os.path.join(path, folder)
    if not os.path.exists(folder):
        try:
            os.mkdir(folder)
        except OSError as e:
            print(f"创建文件夹'{folder}'时出现错误：{e}")


def printascii():

    print(Fore.GREEN + """ 
@@@@@@@@   @@@@@@    @@@@@@   @@@@@@@   @@@@@@   @@@@@@@@  @@@@@@@@  
@@@@@@@@  @@@@@@@@  @@@@@@@   @@@@@@@  @@@@@@@   @@@@@@@@  @@@@@@@@  
@@!       @@!  @@@  !@@         @@!    !@@       @@!       @@!       
!@!       !@!  @!@  !@!         !@!    !@!       !@!       !@!       
@!!!:!    @!@!@!@!  !!@@!!      @!!    !!@@!!    @!!!:!    @!!!:!    
!!!!!:    !!!@!!!!   !!@!!!     !!!     !!@!!!   !!!!!:    !!!!!:    
!!:       !!:  !!!       !:!    !!:         !:!  !!:       !!:       
:!:       :!:  !:!      !:!     :!:        !:!   :!:       :!:       
 ::       ::   :::  :::: ::      ::    :::: ::    :: ::::   :: ::::  
 :         :   : :  :: : :       :     :: : :    : :: ::   : :: ::   
""" + Fore.RESET)


# def update_project():
#     try:
#         print(Fore.MAGENTA +"正在检查更新..."+ Fore.RESET)
#         if not IS_git_ok:
#             # print(Fore.RED +"请安装git:https://git-scm.com/downloads (或配置git到系统路径) ,否则无法使用更新功能"+ Fore.RESET)
#             return False
#         repo = update.check()
#         if repo is True:
#             print(Fore.GREEN +"此版本为最新版"+ Fore.RESET)
#         else:
#             print(Fore.RED +"FastSee不是最新版，正在自动更新..."+ Fore.RESET)
#             try:
#                 _=update.update_repo(repo)  # 在这里调用 update_repo 函数进行更新
#                 if _:
#                     print(Fore.GREEN + "FastSee更新成功!" + Fore.RESET)
#             except Exception as e:
#                 print("更新出错:")
#                 print(e)
#     except RuntimeError as e:
#         print(f"错误: {e}")

async def run_explore_and_screen(filename, nowtime, method,redict):
    await urlExplore.explore(filename, nowtime, method,redict)
    await urlScreen.screen(filename, nowtime)

def commend():
    parser = argparse.ArgumentParser(prog="FastSee", description='欢迎使用FastSee',usage='更多选项请查看配置文件config.py')
    parser.add_argument("-f", type=str, help="需要探测的txt文件",default=None,metavar='UrlFile')
    # 添加一个positional arguments，叫a,读取类型为int（默认是字符串）
    parser.add_argument("-s", help="启动截屏探测",action="store_true")
    parser.add_argument("-e", help="启动存活探测",action="store_true")
    parser.add_argument("-m",type=str, help="存活探测方法(默认get):get/post/put", default='get',metavar='METHOD')
    parser.add_argument("-a",type=str, help="是否允许跟随转跳,默认为True", default='True',metavar='FOLLOW')
    # parser.add_argument("--update", action='store_true', help="检测更新,请提前备份该项目文件夹中自己创建的文件")
    # parser.add_argument("-all", help="全部探测都使用",action="store_true")
    parser.exit_on_error = False
    args = parser.parse_args()
    # sys 是一个提供与 Python 解释器交互功能的模块，而 sys.argv 是一个表示命令行参数的列表。
    if len(sys.argv) == 1:
        printascii()
        # if config.auto_update_tool:
        #     update_project()
        parser.print_help()
        sys.exit()
    return args
def main():
    if sys.version_info < (3, 9):
        sys.stderr.write("fastsee需要python3.9以上的版本\n") #专门用于输出错误或警告信息
        sys.exit(1)
    args = commend()
    printascii()
    # if config.auto_update_tool or args.update:
    #     update_project()
    #     if args.update:
    #         sys.exit()
    create_folders('./', 'img')
    create_folders('./', 'result')
    # nowtime = str(int(time.time()))
    nowtime = time.strftime("%Y-%m-%d-%H-%M-%S") #将文件夹名字从时间戳变为年-月-日-时-分-秒
    redict=args.a
    if redict.lower() in ['true','false']:
        if redict.lower() == 'true':
            redict=True
        else:
            redict=False
    else:
        print("无效的参数:",redict)
        sys.exit(1)  # 退出脚本并返回状态码 1 表示错误
    if args.f==None:
        print('请输入要探测的文件:txt')
    else:
        if args.s==False and args.e==False:
            print('请输入探测类型:-s -e')
        else:
            if args.e==True and args.s==False:
                method = args.m
                method=method.strip()
                if method.upper() not in ['GET', 'PUT', 'POST']:
                    print('无效的方法选项,已按默认get方法进行\n')
                    method='get'
                create_folders('./result', nowtime + "存活探测"+method.lower())
                filename=args.f
                urlExplore.Explore(filename,nowtime,method,redict)
            else:
                if args.s==True and args.e==False:
                    create_folders('./result', nowtime+"截屏探测")
                    create_folders('./img', nowtime)
                    filename = args.f
                    urlScreen.Screen(filename,nowtime)
                else:
                    if args.s==True and args.e==True:
                        # 下面进行实际循环策略不同操作系统的设置
                        if sys.platform == 'win32':
                           print("目前Windows还不支持同时进行两个探测,请使用其他系统。")
                        else:
                            # 在其他系统上使用默认的事件循环策略
                            policy = asyncio.DefaultEventLoopPolicy()
                            asyncio.set_event_loop_policy(policy)
                            print("正在双模式探测...")
                            filename = args.f
                            method = args.m
                            method = method.strip()
                            if method.upper() not in ['GET', 'PUT', 'POST']:
                                print('无效的方法选项,已按默认get方法进行\n')
                                method = 'get'
                            create_folders('./result', nowtime + "存活探测" + method.lower())
                            create_folders('./result', nowtime + "截屏探测")
                            create_folders('./img', nowtime)
                            # 运行双异步任务
                            asyncio.run(run_explore_and_screen(filename, nowtime, method,redict))
if __name__ == '__main__':
    try:
        main()  # 调用主程序函数
    except KeyboardInterrupt:
        # 捕获用户按下 Ctrl+C 导致的中断异常，程序优雅退出
        print("\n程序已被用户中断，正在退出...")
    except Exception as e:
        # 捕获除 KeyboardInterrupt 以外的所有异常，并打印堆栈跟踪帮助调试
        # traceback.print_exc()
        print(e)
    finally:
        sys.exit(0)